package es.esp.ut08.herencia;

public class Test {

	public static void main(String[] args) {

		System.out.println("\n---- Comienza el test ----\n");

		//Animal a = new Animal(); // No se puede instanciar una clase
		// abstracta
		System.out.println("Nuevo objeto Dog en la referencia Animal a "); // true
		Animal a = new Dog(); // Una variable del supertivo pueder tener una
								// referencia de una subclase
		System.out.println("\testado de hambre de a "); // true
		a.getHunger(); // Devuelve el estado de hambre, 0.5
	
		System.out.println("\ta hace ruido"); // true
		a.makeNoise(); // Se ejecuta el método makeNoise del perro, se muestra
						// "¡Guau!"
		System.out.println("\t¿Está a despierto? "); // true
		a.isAwake(); // Imprime si está despierto(true) o no(false), true.

		System.out.println("a come "); // true
		a.eat(); // eat es heredado por Dog y cambia hunger a 0

		System.out.println("\testado de hambre de a "); // true
		a.getHunger(); // Devuelve el estado de hambre, 0.0

		System.out.println("¿Es a de clase Perro? " + (a instanceof Dog)); // true
		System.out.println("¿Es a subclase de Canine ?" + (a instanceof Canine)); // true
		System.out.println("¿Es a subclase de Animal ?" + (a instanceof Animal)); // true
		System.out.println("¿Es a subclase de Object ?" + (a instanceof Object)); // true

		System.out.println("\n---- Test de interfaces ----\n");

		System.out.println("Nuevo objeto Leon en la referencia l "); 
		Lion l = new Lion();
		
		System.out.println("\tl se levanta "); 
		l.stand(); // stand() es implementada en la clase Leon
		
		System.out.println("Nuevo objeto Leon en la referencia Trainable bestia "); 
		Trainable bestia = new Lion();
		
		System.out.println("\tbestia se sienta "); 
        bestia.sit(); // llama al método aproviado del objeto bestia para que el
						// león se siente, imprime León sentado
		
        System.out.println("\tbestia se levanta "); 
		bestia.stand(); // Léon levantado

		System.out.println("Nuevo objeto Dog en la referencia bestia "); 
		bestia = new Dog();
		
		System.out.println("\tbestia se sienta "); // true
        bestia.sit(); // Perro sentado
   
		System.out.println("\tbestia se levanta "); // true
		bestia.stand(); // Perro levantado stand

		System.out.println("\n---- Herencia con clases concretas ---- \n");

		System.out.println("Nuevo objeto SeeingEyeDog en la referencia d "); // true
		SeeingEyeDog d = new SeeingEyeDog(5);
		
		System.out.println("Tracking code ");
		d.getTrackingCode(); // imprime 5
		
		System.out.println("¿Es d de clase SeeingEyeDog? "
				+ (d instanceof SeeingEyeDog)); // true
		System.out.println("¿Es d subclase de Dog? " + (d instanceof Dog)); // true
		System.out
				.println("¿Es d subclase de Canine? " + (d instanceof Canine)); // true
		System.out
				.println("¿Es d subclase de Animal? " + (d instanceof Animal)); // true
		System.out
				.println("¿Es d subclase de Object? " + (d instanceof Object)); // true

		System.out.println("\n---- Algunas interacciones más ---- \n");

		System.out.println("Nuevo objeto Lion en la referencia l2 "); 
        Lion l2 = new Lion();
		
        System.out.println("\t¿Está l2 despierto? "); 
		l2.isAwake(); // true
		
		System.out.println("\testado de hambre de l2 "); 
		l2.getHunger(); // devuelve el estado de hambre del león 0.9
		
		System.out.println("l2 come"); // true
		l2.eat();
		
		System.out.println("\testado de hambre de l2 "); 
		l2.getHunger(); // 0.0

		System.out.println("Nuevo objeto Cat en la referencia c ");
		Cat c = new Cat();
		
		System.out.println("\testado de hambre de c "); // true
		c.getHunger(); // 0.4
		
		System.out.println("\tvidas de c "); // true
		c.getLivesLeft(); // 7
		
		System.out.println("\tc hace ruido"); // true
		c.makeNoise(); // "¡miau!"

	}

}
